LW2000

 

Nombre:      Visión general del cracking con SoftICE

Herramientas:       SoftICE

                   Cerebro

Cracker:                LW2000

Tutorial:                número 27

 

Renuncia: Este tutorial tiene una finalidad únicamente educativa. No asumo ninguna responsabilidad por el mal uso de éste material.

 

Bien, me han preguntado montones de veces por lo básico en el cracking con SoftICE así que, ¡aquí va una pequeña Visión General!

 

 

Teclas en SoftICE

Tecla

Función

F1

Ayuda

F2

Alternar la ventana Register

F5

Retornar a Windows/aplicación

F8

Tracear siguiente instrucción

(va dentro de los CALL)

F10

Tracear siguiente instrucción

(se salta los CALL)

F11

Ir a la instrucción de llamada

F12

Ejecutar hasta el siguiente RET

 

 

Las ventanas de SoftICE

WR

Muestra/oculta la ventana Register

WD

Muestra/oculta la ventana Data

WC

Muestra/oculta la ventana Code

WL

Muestra/oculta la ventana Locals

(Alt-l, recibe el foco)

WW

Muestra/oculta la ventana Watch

(Alt-w, recibe el foco)

 

 

Las teclas en SoftICE

Ctrl

Flecha arriba

Flecha abajo

RePág

AvPág

Desplaza la ventana Code

Shift

Flecha arriba

Flecha abajo

RePág

AvPág

Desplaza la ventana Command (introducción de comandos)

Alt

Flecha arriba

Flecha abajo

RePág

AvPág

Desplaza la ventana Data

 

Los registros

 

¡Hey, sí! ¡Lo ha adivinado! La ‘e’ en ‘EAX’ es por que son de 32 bits.

 

Los Registros

AX

Registro acumulador

BX

Registro base

CX

Registro contador

DX

Registro de datos

 

Cada uno de los anteriores registros de 16 bits puede ser dividido en dos registros de 8 bits.

 

Los Registros (división)

AH

Registro acumulador alto

AL

Registro acumulador bajo

BH

Registro base alto

BL

Registro base bajo

CH

Registro contador alto

CL

Registro contador bajo

DH

Registro de datos alto

DL

Registro de datos bajo

 

 

Registros de índice

SI

Indice fuente

DI

Indice destino

 

 

Registros de pila

BP

Puntero a base

SP

Puntero a la pila

 

 

Registros de segmento

CS

Segmento de código

DS

Segmento de datos

ES

Segmento extra

SS

Segmento de pila

 

Por cierto: “D EAX” y “? EAX” muestran lo que hay dentro del registro EAX.

 

Los flags

 

Flags

O

Flag de desbordamiento (se activará después de un comando matemático, por ejemplo ‘SUB’)

D

Flag de dirección (le dice a la CPU que incremente o decremente en instrucciones LODSB, STOSB, e instrucciones parecidas)

I

Flag de interrupción (le dice a la CPU si debe aceptar entrada hardware)

S

Flag de signo (indica si el valor final tenía signo o no)

Z

Flag de cero (indica si el valor final era cero o no)

A

Flag auxiliar de acarreo

P

Flag de paridad

C

Flag de acarreo (como el flag de desbordamiento pero se activa si se produce un desbordamiento en un entero sin signo)

 

Comandos de manipulación de Flags

 

Comandos de manipulación de flags

CLC

Borrar flag de acarreo

CLD

Borrar flag de dirección

CLI

Borrar flag de interrupción

CMC

Complementar flag de acarreo

STC

Activar flag de acarreo

STI

Activar flag de interrupción

 

A propósito: no se puede cambiar el flag de cero ni el de signo mediante comando. Hay que usar “R FL Z” para cambiar el flag de Cero y “R FL S” para cambiar el flag de Signo.

 

Los saltos

JA

Saltar si es mayor (sin signo)

JAE

Saltar si es mayor o igual (sin signo)

JB

Saltar si es menor (sin signo)

JBE

Saltar si es menor o igual (sin signo)

JC

Saltar si hay acarreo

JCXZ

Saltar si CX es cero

JE

Saltar si es igual

JZ

Saltar si es cero (igual)

JG

Saltar si es mayor (con signo)

JGE

Saltar si es mayor o igual (con signo)

JL

Saltar si es menor (con signo)

JLE

Saltar si es menor o igual (con signo)

JNA

Saltar si no es mayor (sin signo)

JNAE

Saltar si no es mayor o igual (sin signo, igual que JB)

JNB

Saltar si no es menor (sin signo)

JNBE

Salta si no es menor o igual (sin singo)

JNC

Saltar si no hay acarreo

JNE

Saltar si no es igual

JNG

Saltar si no es mayor (con signo)

JNGE

Saltar si no es mayor o igual (con signo)

JNL

Saltar si no es menor (con signo)

JNLE

Saltar si no es menor o igual (con signo)

JNO

Saltar si no hay desbordamiento

JNP

Saltar si no hay paridad

JNS

Saltar si no tiene signo

JNZ

Saltar si no es cero (igual)

JO

Saltar si hay desbordamiento

JP

Saltar si hay paridad

JPE

Saltar si hay paridad par (PF = 1)

JPO

Saltar si hay paridad impar (PF = 0)

JS

Saltar si hay signo

JZ

Saltar si es cero (igual)

 

Operaciones MOV

 

‘MOV’ desplaza un valor a un registro a una posición de memoria.

 

‘MOV CX,AX’: AX se guarda en CX

‘MOV [CX],AX: esto guarda AX en la posición de memoria apuntada por CX.

 

Operaciones CALL/RET

 

Se usa ‘CALL’ y ‘RET’ para llamar y retornar de los procedimientos. Si usted quiere que una función devuelva algo, lo más sencillo es que guarde el valor de retorno en un registro y después haga un RET.

 

Ie., si una función debe retornar con EAX = 1, entonces símplemente ponemos nuestro CALL así:

 

MOV EAX,1

RET

 

Los breakpoints

 

Como los registros, los llamadas al API difieren entre 16 bits y 32 bits. Si tenemos una víctima de 32 bits, símplemente añadimos una ‘a’ al final del nombre de la función. Ie., ‘getWindowText’ sería ‘getWindowTextA’. A propósito: ‘BL’ listará todos los breakpoint que tengamos establecidos.

 

Borrar breakpoints:

 

“BC suBreakpoint”; ie., “BC getDlgItemTextA” borrará ése breakpoint

“BC 0”, borrará el breakpoint etiquetado como 0

“BC 1,3”, borrará los breakpoints etiquetados como 1 y 3

“BC *”, borrará todos los breakpoints que hayamos establecido

 

Desactivar breakpoints:

 

“BD suBreakpoint”; ie., “BC getDlgItemTextA” desactivará ése breakpoint

“BD 1,3,4”, desactivará los breakpoints etiquetados como 1, 3 y 4

“BD *”, desactivará todos los breakpoints

 

Activar breakpoints:

 

“BE suBreakpoint”; ie., “BE getDlgItemTextA” activará ése breakpoint

“BE 1,4,7”, activará los breakpoints etiquetados 1, 4 y 7

“BE *”, activará todos los breakpoints

 

Breakpoints útiles:

 

¡Recuerde poner un ‘a’ al final para las llamadas al API de 32 bits!

 

General:

 

·         BPX messageBox

·         BPX getDlgItemText

·         BPX getWindowText

·         BPX hMemCpy

·         BPX showWindow

·         BPX upDateWindow

·         BMSG xxxx wm_getText

·         BMSG xxxx wm_command

·         BMSG xxxx wm_move

 

Relaccionadas con ficheros Key:

 

·         BPINT 21 if AH==3Dh (DOS)

·         BPINT 31 if AH==3Fh (DOS)

·         BPINT 21 if AH==3Dh (DOS)

·         BPX readFileA

·         BPX createFileA

 

Entrada por teclado:

 

·         BPINT 16 if AH==0 (DOS)

·         BPINT 21 if AH==0xA (DOS)

 

Relacionadas con la hora:

 

·         BPINT 21 if AH==2Ah (DOS)

·         BPX getLocalTime

·         BPX getFileTime

·         BPX getSystemTime

 

CD-ROM/Disco:

 

·         BPINT 13 if AH==2 (DOS)

·         BPINT 13 if AH==3 (DOS)

·         BPÌNT 13 if AH==4 (DOS)

·         BPX getFileAttributesA

·         BPX getFileSize

·         BPX getLastError

·         BPX readFile

·         BPIO –h (la dirección del puerto de su CD-ROM) R

 

Cracking ‘dongle’:

 

·         BPIO –h 278 R

·         BPIO –h 378 R

 

¡Se acabó! Fácil, ¿no? ¿Algún comentario? Envíeme un email a LW2000@gmx.net. o vaya a http://www.LW2000.cjb.net

 

Gracias a tKC por sus tutoriales. Empecé leyendo su primer tutorial y todavía sigo leyéndolos.

 

Traducción de: MeGaBiTe